define([ "profesor/js/profesor-util", "_", "common/js/user-module" ], function(
		app, _) {
	app.config(function($stateProvider, $urlRouterProvider) {
		$urlRouterProvider.otherwise("/asignaturas");
		$stateProvider.state("asignaturas", {
			url : '/asignaturas',
			templateUrl : '/profesor/asignaturas.html',
			controller : 'AsignaturasCtrl'
		});
		$stateProvider.state("asignaturas.a", {
			url : '/:idMateria/:idCurso',
			templateUrl : '/profesor/asignatura.html',
			controller : 'AsignaturaCtrl'
		});
		$stateProvider.state("indicadores", {
			url : '/indicadores',
			templateUrl : '/profesor/indicadores-nav.html',
			controller : 'IndicadoresCtrl'
		});
		$stateProvider.state("indicadores.mg", {
			url : '/mg/:idMateria/:idGrado',
			templateUrl : '/profesor/indicadores.html',
			controller : 'IndicadoresMateriaCtrl'
		});

	});

	app.controller("ProfesorCtrl", function($scope, User, $window, $state,
			epModal, $stateParams) {

		$scope.user = User.getMyInfo();
		$scope.isState = function(state, params) {
			var b = $state.includes(state);
			if (params)
				_.forEach(params, function(v, k) {
					b = b && $stateParams[k] == v;
				});
			return b;
		}
		$scope.logOut = function() {
			User.logout({}, function() {
				$window.location.href = "/";
			}, function() {
				$window.location.href = "/";
			})
		};

	});

	app.controller("AsignaturasCtrl", function($scope, Profesor, $state) {
		$scope.asignaturas = Profesor.getMisAsignaturas();
	});

	app.controller("AsignaturaCtrl", function($scope, Profesor, $stateParams,
			epLoading, epModal) {

		$scope.curso = Profesor.getCurso({
			idCurso : $stateParams.idCurso
		}, function(curso) {
			$scope.indicadores = Profesor.getIndicadoresPeriodoActual({
				idMateria : $stateParams.idMateria,
				idGrado : curso.idGrado
			});
		});

		Profesor.getIndicadoresEstudiantes({
			idMateria : $stateParams.idMateria,
			idCurso : $stateParams.idCurso,
		}, function(indicadoresPeriodo) {
			$scope.indicadoresEstudiantes = _.groupBy(indicadoresPeriodo,
					'idEstudiante');

		});

		$scope.addIndicador = function(estudiante, indicador) {

			if (!$scope.indicadoresEstudiantes[estudiante.id])
				$scope.indicadoresEstudiantes[estudiante.id] = [];

			var i = _.extend({
				idEstudiante : estudiante.id,
				idMateria : $stateParams.idMateria,
				idGrado : $scope.curso.idGrado
			}, indicador);
			epLoading(Profesor.newIndicadorEstudiante({}, i, function(data) {
				$scope.indicadoresEstudiantes[estudiante.id].push(data);
			}), "#ep-cal-cort-" + estudiante.id);

		}
		$scope.removeIndicador = function(estudiante, indicador) {
			if (!$scope.indicadoresEstudiantes[estudiante.id])
				$scope.indicadoresEstudiantes[estudiante.id] = [];
			var i = _.extend({
				idEstudiante : estudiante.id,
				idMateria : $stateParams.idMateria,
				idGrado : $scope.curso.idGrado
			}, indicador);
			epLoading(Profesor.deleteIndicadorEstudiante(i, {}, function(data) {
				_.remove($scope.indicadoresEstudiantes[estudiante.id], function(indic) {
					return indic.categoria == indicador.categoria
							&& indic.consecutivo == indicador.consecutivo;
				});
			}), "#ep-cal-cort-" + estudiante.id);
		}
		$scope.changeCalificacion = function(estudiante, nota) {
			var cc = {
				idEstudiante : estudiante.id,
				idMateria : $stateParams.idMateria,
				idGrado : $scope.curso.idGrado,
				nota : nota
			};
			epLoading(Profesor.setCalificacionPeriodo({}, cc), "#ep-cal-cort-"
					+ estudiante.id);
		}
		$scope.sendMessage = function() {
			Profesor.sendMessage({}, {
				idEstudiante : $scope.toEstudiante.id,
				mensaje : $scope.msg
			}, function() {

				epModal.close("mensaje-estudiante");
				$scope.toEstudiante = undefined;
				$scope.msg = undefined;
			});

		}
	});

	app.controller("IndicadoresCtrl", function($scope, Profesor, epCache, $state,
			epGlobals, $stateParams) {
		var mapaMaterias = {};
		var mapaGrados = {};
		$scope.materiasGrado = Profesor.getMateriasGrado();
		_.sync(Profesor.getMaterias({}, function(materias) {
			mapaMaterias = _.indexBy(materias, 'id')

		}), Profesor.getGrados({}, function(grados) {

			mapaGrados = _.indexBy(grados, 'id');

		}), $scope.materiasGrado).then(function() {

			_.each($scope.materiasGrado, function(materiaGrado) {
				materiaGrado.materia = mapaMaterias[materiaGrado.idMateria];
				materiaGrado.grado = mapaGrados[materiaGrado.idGrado];

			});			
		});

	});

	app.controller("IndicadoresMateriaCtrl", function($scope, Profesor,
			$stateParams, epChanging, epLoading, epGlobals) {
		epGlobals.idMateria = $stateParams.idMateria;
		epGlobals.idGrado = $stateParams.idGrado;
		$scope.categorias = [ 'Fortalezas', 'Debilidades', 'Recomendaciones' ];
		$scope.indicadores = Profesor.getIndicadoresPeriodoActual({
			idMateria : $stateParams.idMateria,
			idGrado : $stateParams.idGrado
		}, function() {
			$('#collapseFortalezas').collapse();
		});

		$scope.nuevoIndicador = function(d) {
			Profesor.newIndicadorPeriodoActual({
				idMateria : $stateParams.idMateria,
				idGrado : $stateParams.idGrado
			}, {
				categoria : d
			}, function(data) {
				$scope.indicadores.push(data);
			});
		}

		$scope.borrarIndicador = function(indicador, $index) {

			Profesor.deleteIndicador(indicador, {}, function() {
				$scope.indicadores.splice($scope.indicadores.indexOf(indicador), 1)
			});
		}

		$scope.actualizarIndicador = function(i) {

			epChanging(i, 1300, function() {
				epLoading(Profesor.updateIndicador(i, i), "#divIndicador" + i.categoria
						+ i.consecutivo);
			});
		}

	});

	return app;

});
